package co.edu.uniandes.ecos.itera.tsp.pruebas;

import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.junit.Test;
import co.edu.uniandes.ecos.itera.tsp.accesodatos.DefectoDAL;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.mundo.Defecto;

@LogT(date="2011-03-19", min=10, taskId=22)
@Avance(taskId=22, termino='S')
/**
 * Realiza la prueba de la logica de acceso a datos para Defectos
 */
public class PruebaDefectoDAO extends TestCase{
	private DefectoDAL defectos;
	private List<Defecto> listadoDefectos;
	/**
	 * Prueba completa; inicializando, serializando y deserializando
	 */
	@LogT(date="2011-03-19", min=5, taskId=22)
	@Loc(size=3, taskId=22)
	public void testCompleto()
	{
		testDefectoDAL();
		testSerializar();
		testDeSerializar();
		
	}
	/**
	 * Prueba de inicializacion.
	 */
	@LogT(date="2011-03-19", min=5, taskId=22)
	@Loc(size=3, taskId=22)
	@Test
	public void testDefectoDAL() {
		
		
		if(defectos==null)
		{
			
			defectos = new DefectoDAL();
		}
	}
	/**
	 * Prueba la serializacion
	 */
	@LogT(date="2011-03-19", min=10, taskId=22)
	@Loc(size=13, taskId=22)
	@Test
	public void testSerializar() {
		listadoDefectos  = this.generarDefectos();
		this.testDefectoDAL();
		System.out.println("DEFECTOS A SERIALIZAR:");
		for(Defecto prueba: listadoDefectos)
		{
			System.out.println("ID DEFECTO:"+prueba.getIdDefecto());
			System.out.println("DSCRIPCION:"+prueba.getDescription());
			
		}
		try {
			defectos.serializar((ArrayList<Defecto>)listadoDefectos);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			assert false: e.getMessage() + e.getCause();
		}
		finally
		{
			
			listadoDefectos = null;
		}
	}
	/**
	 * Prueba la deserializacion
	 */
	@LogT(date="2011-03-19", min=10, taskId=22)
	@Loc(size=13, taskId=22)
	@Test
	public void testDeSerializar() {
		this.testDefectoDAL();
		try {
			this.listadoDefectos = defectos.deSerializar();
			assert listadoDefectos!=null : "No se han cargado defectos";
			System.out.println("DEFECTOS DESERIALIZADOS:");
			for(Defecto prueba: listadoDefectos)
			{
				System.out.println("ID DEFECTO:"+prueba.getIdDefecto());
				System.out.println("DSCRIPCION:"+prueba.getDescription());				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			assert false: e.getMessage();
		}
		finally
		{
			
			listadoDefectos = null;
		}

	}
	@LogT(date="2011-03-19", min=10, taskId=22)	
	@Loc(size=5, taskId=22)
	public List<Defecto> generarDefectos()
	{
		List<Defecto> defectoPrueba = new ArrayList<Defecto>();
		for (int i = 0; i < (Math.random()*10); i++ )
		{
			Defecto prueba = new Defecto((i),("Descripcion"+i));
			defectoPrueba.add(prueba);
		}
		return defectoPrueba;
		
	}

}
